//package com.mi.rule.db.core;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.alibaba.fastjson.serializer.SerializerFeature;
//import com.baomidou.mybatisplus.core.conditions.Wrapper;
//import com.mi.rule.db.old.MiMapper;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.io.Serializable;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//
//
///**
// * 通用的查询实现类
// * <p>
// *
// * @author 王永吉
// * @date 2020-01-14
// */
//@Service
//public class MiDaoImpl implements MiDao {
//    @Autowired
//    private MiMapper miMapper;
//
//    @Override
//    public <P extends MiEntity> long insert(P entity) {
//        if (entity == null) return 0;
//        MiHelp miHelp = MiHelp.create(entity);
//        return miMapper._insert_by_entity_(miHelp.tableName, miHelp.column, entity);
//    }
//
//    @Override
//    public <M extends Map<?, ?>> long insert(String tableName, M map) {
//        return miMapper._insert_by_map_(tableName, map);
//
//    }
//
//    @Override
//    public <P extends MiEntity> long insertOrUpdate(P entity) {
//        MiHelp miHelp = MiHelp.create(entity);
//        if (miMapper._count_by_id_(miHelp.tableName, miHelp.idColumn, miHelp.idValue) <= 0) {
//            return insert(entity);
//        }
//        return updateById(entity);
//    }
//
//    @Override
//    public <M extends Map<?, ?>> long insertOrUpdate(String tableName, M map) {
//        if (miMapper._count_by_id_(tableName, "id", map.get("id")) <= 0) {
//            return insert(tableName, map);
//        }
//        return updateById(tableName, map, map.get("id").toString());
//    }
//
//    @Override
//    public long insert(String sqlString) {
//        return miMapper._insert_by_str_(sqlString);
//    }
//
//    @Override
//    public long insert(String tableName, String column, String values) {
//        String sqlString = "insert into " + tableName + "(" + column + " ) values ( " + values + " )";
//        return miMapper._insert_by_str_(sqlString);
//    }
//
//    @Override
//    public <P extends MiEntity> long insertBatch(List<P> listEntity, int loopLength) {
//        long addCount = 0;
//        if (listEntity.size() == 0) return 0;
//        MiHelp miHelp = MiHelp.create(listEntity.get(0));
//
//        int count = listEntity.size() / loopLength;
//        for (int i = 0; i < count; i++) {
//            addCount += miMapper._insert_batch_entity_(miHelp.tableName, miHelp.column, listEntity.subList(i * loopLength, (i + 1) * loopLength));
//        }
//        int yu = listEntity.size() % loopLength;
//        if (yu > 0) {
//            addCount += miMapper._insert_batch_entity_(miHelp.tableName, miHelp.column, listEntity.subList(count * loopLength, (count * loopLength) + yu));
//        }
//
//        return addCount;
//    }
//
//    @Override
//    public <M extends Map<?, ?>> long insertBatch(String tableName, List<M> listMap, int loopLength) {
//        long addCount = 0;
//        if (listMap.size() == 0) return 0;
//
//        int count = listMap.size() / loopLength;
//        for (int i = 0; i < count; i++) {
//            addCount += miMapper._insert_batch_map_(tableName, listMap.subList(i * loopLength, (i + 1) * loopLength));
//        }
//        int yu = listMap.size() % loopLength;
//        if (yu > 0) {
//            addCount += miMapper._insert_batch_map_(tableName, listMap.subList(count * loopLength, (count * loopLength) + yu));
//        }
//
//        return addCount;
//    }
//
//    @Override
//    public <P extends MiEntity> long insertBatch(List<P> listEntity) {
//        return insertBatch(listEntity, listEntity.size());
//    }
//
//    @Override
//    public <M extends Map<?, ?>> long insertBatch(String tableName, List<M> listMap) {
//        return insertBatch(tableName, listMap, listMap.size());
//    }
//
//    @Override
//    public <P extends MiEntity> long insertOrUpdateBatch(List<P> listEntity) {
//        return insertOrUpdateBatch(listEntity, 1000);
//    }
//
//    @Override
//    public <M extends Map<?, ?>> long insertOrUpdateBatch(String tableName, List<M> listMap) {
//        return insertOrUpdateBatch(tableName, listMap, 1000);
//    }
//
//    @Override
//    public <P extends MiEntity> long insertOrUpdateBatch(List<P> listEntity, int loopLength) {
//        long updateCount = 0;
//        if (listEntity.size() == 0) return 0;
//        List<MiEntity> list = new ArrayList<>();
//        for (MiEntity t : listEntity) {
//            MiHelp miHelp = MiHelp.create(t);
//            if (miMapper._count_by_id_(miHelp.tableName, miHelp.idColumn, miHelp.idValue) <= 0) {
//                list.add(t);
//            } else {
//                //执行修改操作
//                updateCount += updateById(t);
//            }
//        }
//        //拿到数据库中不存在的数据，执行添加
//        long addCount = insertBatch(list, loopLength);
//        return updateCount + addCount;
//    }
//
//    @Override
//    public <M extends Map<?, ?>> long insertOrUpdateBatch(String tableName, List<M> listMap, int loopLength) {
//        long updateCount = 0;
//        if (listMap.size() == 0) return 0;
//        List<M> list = new ArrayList<>();
//        for (M map : listMap) {
//            if (miMapper._count_by_id_(tableName, "id", map.get("id")) <= 0) {
//                list.add(map);
//            } else {
//                //执行修改操作
//                updateCount += updateById(tableName, map, map.get("id").toString());
//            }
//        }
//        //拿到数据库中不存在的数据，执行添加
//        long addCount = insertBatch(tableName, list, loopLength);
//        return updateCount + addCount;
//    }
//
//    @Override
//    public <T> long delete(Wrapper<T> wrapper) {
//        return miMapper._delete_by_wrapper_(((MiWrapper<T>) wrapper).getTableName(), wrapper);
//    }
//
//    @Override
//    public long delete(String sqlString) {
//        return miMapper._delete_by_str_(sqlString);
//    }
//
//    @Override
//    public long delete(String tableName, String condition) {
//        return miMapper._delete_by_str_("delete from " + tableName + " where " + condition);
//    }
//
//    @Override
//    public long deleteById(String tableName, Serializable id) {
//        return miMapper._delete_by_id_(tableName, id);
//    }
//
//    @Override
//    public <M extends Map<?, ?>> long deleteByMap(String tableName, M map) {
//        return miMapper._delete_by_map_(tableName, map);
//    }
//
//    @Override
//    public <P extends MiEntity> long deleteById(Class<P> entityClass, Serializable id) {
//        return miMapper._delete_by_id_(MiHelp.getTableName(entityClass), id);
//    }
//
//    @Override
//    public long deleteByIds(String tableName, List<Serializable> ids) {
//        return miMapper._delete_by_ids_(tableName, ids);
//    }
//
//    @Override
//    public <P extends MiEntity> long deleteByIds(Class<P> entityClass, List<Serializable> ids) {
//        return miMapper._delete_by_ids_(MiHelp.getTableName(entityClass), ids);
//    }
//
//    @Override
//    public <P extends MiEntity, M extends Map<?, ?>> long deleteByMap(Class<P> entityClass, M map) {
//        return miMapper._delete_by_map_(MiHelp.getTableName(entityClass), map);
//    }
//
//    @Override
//    public long update(String sqlString) {
//        return miMapper._update_by_str_(sqlString);
//    }
//
//    @Override
//    public long update(String tableName, String setString, String condition) {
//        return miMapper._update_by_str_("update " + tableName + " set " + setString + " where " + condition);
//    }
//
//    public <P extends MiEntity> long update(P entity) {
//        return updateById(entity);
//    }
//
//    @Override
//    public <T> long update(Wrapper<T> wrapper1) {
//        MiWrapper<T> wrapper = (MiWrapper<T>) wrapper1;
//        if (wrapper.getSqlSet() == null) {
//            return 0;
//        }
//        return miMapper._update_by_wrapper_set_sql_(wrapper.getTableName(), wrapper.getSqlSet(), wrapper);
//    }
//
//    @Override
//    public <P extends MiEntity, T> long update(P entity, Wrapper<T> wrapper) {
//        MiHelp miHelp = MiHelp.create(entity);
//        return miMapper._update_by_wrapper_(miHelp.tableName, miHelp.column, entity, wrapper);
//    }
//
//    @Override
//    public <M extends Map<?, ?>, T> long update(M map, Wrapper<T> wrapper1) {
//        MiWrapper<T> wrapper = (MiWrapper<T>) wrapper1;
//        return miMapper._update_by_map_wrapper_(wrapper.getTableName(), map, wrapper1);
//    }
//
//    @Override
//    public <P extends MiEntity> long updateById(P entity) {
//        MiHelp miHelp = MiHelp.create(entity);
//        return miMapper._update_by_id_(miHelp.tableName, miHelp.column, entity, miHelp.idColumn, miHelp.idValue);
//    }
//
//    @Override
//    public <P extends MiEntity> long updateByIds(P entity, List<Serializable> ids) {
//        MiHelp miHelp = MiHelp.create(entity);
//        return miMapper._update_by_ids_(miHelp.tableName, miHelp.column, entity, miHelp.idColumn, ids);
//    }
//
//    @Override
//    public <M extends Map<?, ?>> long updateById(String tableName, M map, Serializable id) {
//        return miMapper._update_by_map_id_(tableName, map, id);
//    }
//
//    @Override
//    public <M extends Map<?, ?>> long updateByIds(String tableName, M map, List<Serializable> ids) {
//        return miMapper._update_by_map_ids_(tableName, map, ids);
//    }
//
//    @Override
//    public <P extends MiEntity> long updateBatchById(List<P> entityList) {
//        if (entityList == null || entityList.size() == 0) {
//            return 0;
//        }
//
//        long count = 0;
//        for (MiEntity entity : entityList) {
//            MiHelp miHelp = MiHelp.create(entity);
//            count += miMapper._update_by_id_(miHelp.tableName, miHelp.column, entity, miHelp.idColumn, miHelp.idValue);
//        }
//        return count;
//    }
//
//    @Override
//    public <M extends Map<?, ?>> long updateBatchById(String tableName, List<M> listMap) {
//        if (listMap == null || listMap.size() == 0) {
//            return 0;
//        }
//
//        long count = 0;
//        for (M map : listMap) {
//            count += miMapper._update_by_map_id_(tableName, map, map.get("id"));
//        }
//
//        return count;
//    }
//
//    @Override
//    public <T> long count(Wrapper<T> wrapper1) {
//        MiWrapper<T> wrapper = (MiWrapper<T>) wrapper1;
//        return miMapper._count_by_wrapper_(wrapper.getTableName(), wrapper.getSqlJoin(), 1, wrapper);
//    }
//
//    @Override
//    public <T> long count(String column, Wrapper<T> wrapper1) {
//        MiWrapper<T> wrapper = (MiWrapper<T>) wrapper1;
//        return miMapper._count_by_wrapper_(wrapper.getTableName(), wrapper.getSqlJoin(), column, wrapper);
//    }
//
//    @Override
//    public long count(String sqlString) {
//        return miMapper._count_by_str_2_(sqlString);
//    }
//
//    @Override
//    public long count(String tableName, String column, String sqlString) {
//        return miMapper._count_by_str_(tableName, "", column, sqlString);
//    }
//
//    @Override
//    public Map selectById(String tableName, Object id) {
//        return selectById(tableName, id, Map.class);
//    }
//
//    @Override
//    public Map selectById(String tableName, String column, Object id) {
//        Map<?, ?> map = miMapper._select_one_by_str_(column, tableName, "", "id = " + id);
//        if (map == null) return null;
//        return parsObj(map, Map.class);
//    }
//
//    @Override
//    public <F> F selectById(String tableName, Object id, Class<F> typeClass) {
//        Map<?, ?> map = miMapper._select_one_by_str_(" * ", tableName, "", "id = " + id);
//        if (map == null) return null;
//        return parsObj(map, typeClass);
//    }
//
//    @Override
//    public <F> F selectById(String tableName, String column, Object id, Class<F> typeClass) {
//        Map<?, ?> map = miMapper._select_one_by_str_(column, tableName, "", "id = " + id);
//        if (map == null) return null;
//        return parsObj(map, typeClass);
//    }
//
//    @Override
//    public <M extends Map<?, ?>> List<M> selectByIds(String tableName, List<Object> ids) {
//        MiWrapper<Object> wrapper = new MiWrapper<>(tableName);
//        wrapper.in("id", ids);
//        return (List<M>) miMapper._select_list_by_wrapper_(" * ", tableName, "", wrapper);
//    }
//
//    @Override
//    public <M extends Map<?, ?>> List<M> selectByIds(String tableName, String column, List<Object> ids) {
//        MiWrapper<Object> wrapper = new MiWrapper<>(tableName);
//        wrapper.in("id", ids);
//        return (List<M>) miMapper._select_list_by_wrapper_(column, tableName, "", wrapper);
//    }
//
//    @Override
//    public <F> List<F> selectByIds(String tableName, List<Object> ids, Class<F> typeClass) {
//        MiWrapper<Object> wrapper = new MiWrapper<>(tableName);
//        wrapper.in("id", ids);
//        List<Map<?, ?>> maps = miMapper._select_list_by_wrapper_(" * ", tableName, "", wrapper);
//        return parsArray(maps, typeClass);
//    }
//
//    @Override
//    public <F> List<F> selectByIds(String tableName, String column, List<Object> ids, Class<F> typeClass) {
//        MiWrapper<Object> wrapper = new MiWrapper<>(tableName);
//        wrapper.in("id", ids);
//        List<Map<?, ?>> maps = miMapper._select_list_by_wrapper_(column, tableName, "", wrapper);
//        return parsArray(maps, typeClass);
//    }
//
//    @Override
//    public Map selectOne(String sqlString) {
//        return miMapper._select_one_str_(sqlString);
//    }
//
//    @Override
//    public <F> F selectOne(String sqlString, Class<F> typeClass) {
//        return parsObj(selectOne(sqlString), typeClass);
//    }
//
//    @Override
//    public List<Map<?, ?>> selectList(String sqlString) {
//        return miMapper._select_list_str_(sqlString);
//    }
//
//    @Override
//    public <F> List<F> selectList(String sqlString, Class<F> typeClass) {
//        return parsArray(selectList(sqlString), typeClass);
//    }
//
//    @Override
//    public <T> T selectOne(Wrapper<T> wrapper1) {
//        MiWrapper<T> wrapper = (MiWrapper<T>) wrapper1;
//        Map<?, ?> map = miMapper._select_one_by_wrapper_(getSqlSelect(wrapper), wrapper.getTableName(), wrapper.getSqlJoin(), wrapper);
//        return parsObj(map, (wrapper).tClass());
//    }
//
//    @Override
//    public <T> List<T> selectList(Wrapper<T> wrapper1) {
//        MiWrapper<T> wrapper = (MiWrapper<T>) wrapper1;
//        List<Map<?, ?>> maps = miMapper._select_list_by_wrapper_(getSqlSelect(wrapper), wrapper.getTableName(), wrapper.getSqlJoin(), wrapper);
//        return parsArray(maps, wrapper.tClass());
//
//    }
//
//    @Override
//    public <F> List<F> selectList(Class<F> typeClass) {
//        MiWrapper<F> wrapper = new MiWrapper<>(typeClass);
//        wrapper.last(" 1=1 ");
//        List<Map<?, ?>> maps = miMapper._select_list_by_wrapper_(getSqlSelect(wrapper), wrapper.getTableName(), wrapper.getSqlJoin(), wrapper);
//        return parsArray(maps, wrapper.tClass());
//    }
//
//    // SELECT COUNT(1) FROM a_user WHERE role_id = '10' AND in_card = '1'
//    // SELECT FROM a_user WHERE role_id = '10' AND in_card = '1' ORDER BY card_count DESC , number ASC LIMIT 0,10
//    @Override
//    public <T> MiPage<T> page(MiPage<T> page, Wrapper<T> wrapper1) {
//        MiWrapper<T> wrapper = (MiWrapper<T>) wrapper1;
//        long current = page.getCurrent();
//        long size = page.getSize();
//        page.setTotal(count(wrapper));
//        long pages = (page.getTotal() + size - 1) / size;
//        page.setPages(pages);
//        List<Map<?, ?>> maps = miMapper._page_by_wrapper_(getSqlSelect(wrapper), wrapper.getTableName(), wrapper.getSqlJoin(), ((current - 1) * size), size, wrapper);
//        List<T> list = parsArray(maps, ((MiWrapper<T>) wrapper1).tClass());
//        page.setRecords(list);
//        return page;
//    }
//
//    @Override
//    public <M extends Map<?, ?>> MiPage<M> page(MiPage<M> page, String sqlString) {
//        long current = page.getCurrent();
//        long size = page.getSize();
//        page.setTotal(selectList(sqlString).size());
//        long pages = (page.getTotal() + size - 1) / size;
//        page.setPages(pages);
//        List<Map<?, ?>> maps = miMapper._page_by_str_(sqlString, ((current - 1) * size), size);
//        page.setRecords((List<M>) maps);
//        return page;
//    }
//
//    private <T> T parsObj(Object map, Class<T> tClass) {
//        String s = JSON.toJSONString(map, SerializerFeature.WriteMapNullValue);
//        return JSONObject.parseObject(s, tClass);
//    }
//
//    private <T> List<T> parsArray(Object map, Class<T> tClass) {
//        String s = JSON.toJSONString(map, SerializerFeature.WriteMapNullValue);
//        return JSONObject.parseArray(s, tClass);
//    }
//
//    private <T> String getSqlSelect(MiWrapper<T> wrapper) {
//        if (wrapper.getSqlSelect() == null || wrapper.getSqlSelect().equals("")) {
//            wrapper.select("*");
//        }
//        return wrapper.getSqlSelect();
//    }
//    //
////    @Override
////    public List<Map> selectList(String tableName, String column, String condition) {
////        return selectList(tableName, column, condition, Map.class);
////    }
////
////    @Override
////    public <F> List<F> selectList(String tableName, String column, String condition, Class<F> typeClass) {
////        List<Map<?, ?>> maps = baseMapper._select_list_by_str_(column, tableName, "", condition);
////        return parsArray(maps, typeClass);
////    }
//
////    @Override
////    public <T> List<T> selectList(String sqlString) {
////        List<Map<?, ?>> maps = baseMapper._select_list_str_(sqlString);
////        return parsArray(maps, Map.class);
////    }
//
//
////
////    public <T> T selectById(Object entity) {
////        if (null == entity) return null;
////        MiHelp miHelp = MiHelp.create(entity);
////        Map<?, ?> map = baseMapper._select_all_by_id_(miHelp.tableName, "", miHelp.idColumn, miHelp.idValue);
////        if (map == null) return null;
////        return (T) parsObj(map, entity.getClass());
////    }
//
////    @Override
////    public <F> F selectOne(String selectColumn, String fromTable, String condition, Class<F> tClass) {
////        Map<?, ?> map = baseMapper._select_one_by_str_(selectColumn, "", fromTable, condition);
////        return parsObj(map, tClass);
////    }
//
//
////    @Override
////    public <M extends Map<?, ?>, T> long update(String tableName, M map, Wrapper<T> wrapper) {
////        return baseMapper._update_by_map_wrapper_(tableName, map, wrapper);
////    }
//
////    @Override
////    public <T, F> F selectOne(Wrapper<T> wrapper1, Class<F> typeClass) {
////        MiWrapper<T> wrapper = (MiWrapper<T>) wrapper1;
////        Map<?, ?> map = baseMapper._select_one_by_wrapper_(getSqlSelect(wrapper), wrapper.tableName(), wrapper.getSqlJoin(), wrapper);
////        return parsObj(map, typeClass);
////    }
//
////    @Override
////    public <T, F> List<F> selectList(Wrapper<T> wrapper1, Class<F> typeClass) {
////        MiWrapper<T> wrapper = (MiWrapper<T>) wrapper1;
////        List<Map<?, ?>> maps = baseMapper._select_list_by_wrapper_(getSqlSelect(wrapper), wrapper.tableName(), wrapper.getSqlJoin(), wrapper);
////        return parsArray(maps, typeClass);
////    }
//
////    @Override
////    public <T> MiPage<T> page(Wrapper<T> wrapper) {
////        return page(new MiPage<>(1, 10), wrapper);
////    }
//
////    @Override
////    public <T, F> MiPage<F> page(Wrapper<T> wrapper, Class<F> typeClass) {
////        return page(new MiPage<>(1, 10), wrapper);
////    }
//
////    @Override
////    public <T> MiPage<T> page(Object current, Object size, Wrapper<T> wrapper) {
////        return page(new MiPage<>(current, size), wrapper);
////    }
//
//}
